/*
 * (c) Copyright 2018 Palantir Technologies Inc. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.palantir.atlasdb.services;

import com.google.common.collect.ImmutableSet;
import com.palantir.atlasdb.config.AtlasDbConfig;
import com.palantir.atlasdb.config.AtlasDbRuntimeConfig;
import com.palantir.atlasdb.factory.ServiceDiscoveringAtlasSupplier;
import com.palantir.atlasdb.factory.timestamp.FreshTimestampSupplierAdapter;
import com.palantir.atlasdb.table.description.Schema;
import com.palantir.atlasdb.util.MetricsManager;
import com.palantir.logsafe.DoNotLog;
import com.palantir.refreshable.Refreshable;
import java.util.Optional;
import java.util.Set;
import javax.net.ssl.SSLSocketFactory;
import org.immutables.value.Value;

@DoNotLog
@Value.Immutable
public abstract class ServicesConfig {

    public abstract AtlasDbConfig atlasDbConfig();

    public abstract AtlasDbRuntimeConfig atlasDbRuntimeConfig();

    @Value.Derived
    public FreshTimestampSupplierAdapter adapter() {
        return new FreshTimestampSupplierAdapter();
    }

    @Value.Derived
    public ServiceDiscoveringAtlasSupplier atlasDbSupplier(MetricsManager metrics) {
        return new ServiceDiscoveringAtlasSupplier(
                metrics,
                atlasDbConfig().keyValueService(),
                Refreshable.only(atlasDbRuntimeConfig().keyValueService()),
                atlasDbConfig().namespace(),
                Optional.empty(),
                atlasDbConfig().initializeAsync(),
                true,
                adapter());
    }

    @Value.Default
    public Set<Schema> schemas() {
        return ImmutableSet.of();
    }

    @Value.Default
    public boolean allowAccessToHiddenTables() {
        return true;
    }

    public abstract Optional<SSLSocketFactory> sslSocketFactory();
}
